/**
 * 
 */
package ar.com.fiuba.team2.services;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.xerces.dom.NotationImpl;

import ar.com.fiuba.team2.services.fake.ChatImplServiceFakeStub;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoCrear;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoCrearE;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoCrearResponseE;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoLeer;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoLeerE;
import ar.fi.uba.taller2.participacion.interfaces.chat.ws.dummys.ChatImplServiceStub.PermisoLeerResponseE;

/**
 * @author sergio
 *
 */
public class SessionHandler {

	public static String URL = "http://localhost:8080/participacion/chat";
	public static boolean test = false;
	public Logger log = LogManager.getLogger(SessionHandler.class);
	
	private static SessionHandler instance;
	private ChatImplServiceStub clientStub;
	
	/**
	 * Contructor privado.
	 * @throws AxisFault
	 */
	private SessionHandler() throws AxisFault {
		if (test) {
			clientStub = new ChatImplServiceFakeStub(URL);
		} else {
			clientStub = new ChatImplServiceStub(URL);			
		}
	}
	
	/**
	 * Devuelve instancia del handler con el stub creado.
	 * 
	 * @return handler
	 * @throws AxisFault
	 */
	public synchronized static SessionHandler getInstance() throws AxisFault {
		if (instance == null) {
			instance = new SessionHandler();
		}
		
		return instance;
	}

	/**
	 * Checkea estado de sesión del miembro.
	 * 
	 * @param miembro
	 * @param idAmbito
	 * @return boolean con el resultado
	 * @throws RemoteException
	 */
	public boolean sessionActiva(String miembro) throws RemoteException {
		throw new IllegalArgumentException("Metodo no implementado");
	}


	/**
	 * Checkea los permisos de escritura del miembro.
	 * 
	 * @param miembro
	 * @param idAmbito
	 * @return boolean con el resultado
	 * @throws RemoteException
	 */
	public boolean permisoEscribir(String miembro,long idAmbito) { //se necesita tambien el ambito
		// TODO implementar con service de participacion
		return true;
	}

	/**
	 * Checkea los permisos de lectura del miembro.
	 * 
	 * @param miembro
	 * @param idAmbito
	 * @return boolean con el resultado
	 * @throws RemoteException
	 */
	public boolean permisoLeer(String miembro,long idAmbito) throws RemoteException {
		PermisoLeerE permisoLeer = new PermisoLeerE();
		PermisoLeer arg0 = new PermisoLeer();
		permisoLeer.setPermisoLeer(arg0);
		
		arg0.setMiembro(miembro);
		arg0.setAmbitoId(idAmbito);
		
		PermisoLeerResponseE result = clientStub.permisoLeer(permisoLeer);
		
		log.info("Consultando permiso lectura para [miembro:" 
				+ miembro + ", ambito: " + idAmbito + " resultado: " 
				+ result.getPermisoLeerResponse().get_return() + "]");
		return result.getPermisoLeerResponse().get_return();
	}
	

	/**
	 * Checkea los permisos de creación del miembro.
	 * 
	 * @param miembro
	 * @param idAmbito
	 * @return boolean con el resultado
	 * @throws RemoteException
	 */
	public boolean permisoCrear(String miembro,long idAmbito) throws RemoteException {
		PermisoCrearE permisoCrear = new PermisoCrearE();
		PermisoCrear arg0 = new PermisoCrear();
		permisoCrear.setPermisoCrear(arg0);
		
		arg0.setMiembro(miembro);
		arg0.setAmbitoId(idAmbito);
		
		PermisoCrearResponseE result = clientStub.permisoCrear(permisoCrear);

		log.info("Consultando permiso crear chat para [miembro:" 
				+ miembro + ", ambito: " + idAmbito + " resultado: " 
				+ result.getPermisoCrearResponse().get_return() + "]");
		return result.getPermisoCrearResponse().get_return();
	}

}
